﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Xml.Linq;

namespace IBoLT.SettingWindows
{
	/// <summary>
	/// Логика взаимодействия для Tree.xaml
	/// </summary>
	public partial class Tree : Window
	{
		// Тектура для предпросмотра
		private System.Drawing.Bitmap texture;

		// Экземпляр класса для построения фрактала Мандельброта (доступ к полям public)
		public Fractals.FractalTree fractal = new Fractals.FractalTree();
		public TextureSettings STexture;

		private CommandBinding commBind;

		public Tree(System.Drawing.Bitmap sourcePreview, TextureSettings STexture)
		{
			this.STexture = STexture;

			InitializeComponent();

			// Добавляю обработчик к событиям в коде, т.к. для его работы необходимо создание формы
			sliderBranchPoint.ValueChanged += hTreeSliderPreview;
			sliderBranchAngle.ValueChanged += hTreeSliderPreview;
			sliderBranchSize.ValueChanged += hTreeSliderPreview;

			// Привязка команд к обработчикам //
			commBind = new CommandBinding(CommandsIBoLT.cTreePreview, hTreePreviewEx); this.CommandBindings.Add(commBind);
			commBind = new CommandBinding(CommandsIBoLT.cTreeGenerate, hTreeGenerateEx); this.CommandBindings.Add(commBind);
			commBind = new CommandBinding(CommandsIBoLT.cTreeChColor, hTreeChColorEx);

			texture = sourcePreview;
			wPreview.Width = sourcePreview.Width;
			wPreview.Height = sourcePreview.Height;

			// Вывожу палитру на форму
			ApplyPaletteToForm();
			CommandsIBoLT.cTreePreview.Execute(null, this);
		}

		// Обработчик изменения значения ползунков
		private void hTreeSliderPreview(object sender, RoutedPropertyChangedEventArgs<double> e)
		{
			CommandsIBoLT.cTreePreview.Execute(null, this);
		}

		// Отображаю на форме настройку палитры для раскраски фрактала
		private void ApplyPaletteToForm()
		{
			// Размер кнопок для вывода цветов
			int buttonSize = 25;

			wPalette.Width = buttonSize;
			wPalette.Height = buttonSize * fractal.palette.Length;

			for (int i = 0; i < fractal.palette.Length; ++i)
			{
				Button b = new Button();
				b.Width = buttonSize;
				b.Height = buttonSize;
				System.Drawing.Color clr = System.Drawing.Color.FromArgb(fractal.palette[i]);
				b.Background = new SolidColorBrush(Color.FromRgb(clr.R, clr.G, clr.B));
				b.TabIndex = i;
				wPalette.Children.Add(b);

				b.CommandBindings.Add(commBind);
				b.Command = CommandsIBoLT.cTreeChColor;
			}
		}

		private void GetDataFromForm()
		{
			fractal.bp = (int)sliderBranchPoint.Value;
			fractal.ba = (int)sliderBranchAngle.Value;
			fractal.bl = (int)sliderBranchSize.Value;
			fractal.bpDev = (int)sliderBranchPointDev.Value;
			fractal.baDev = (int)sliderBranchAngleDev.Value;
			fractal.blDev = (int)sliderBranchSizeDev.Value;
			fractal.depth = (int)sliderDepth.Value;
		}

		// Обработчик кнопок выбора цвета
		private void hTreeChColorEx(object sender, ExecutedRoutedEventArgs e)
		{
			System.Windows.Forms.ColorDialog colorDialog = new System.Windows.Forms.ColorDialog();
			Button btn = (Button)sender;

			if (colorDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
			{
				System.Drawing.Color SDColor = colorDialog.Color;
				Color SWMColor = new Color();

				SWMColor.A = SDColor.A;
				SWMColor.R = SDColor.R;
				SWMColor.G = SDColor.G;
				SWMColor.B = SDColor.B;

				Brush brush = new SolidColorBrush(SWMColor);
				btn.Background = brush;
				fractal.SetColor(colorDialog.Color.ToArgb(), btn.TabIndex);
			}
		}

		// Обработчик кнопки "Просмотр"
		private void hTreePreviewEx(object sender, ExecutedRoutedEventArgs e)
		{
			GetDataFromForm();
			fractal.Texture = (System.Drawing.Bitmap)texture.Clone();
			wPreview.Source = SystemDrawingHelper.BitmapToBitmapImage(fractal.ToBitmap());
		}

		// Обработчик кнопки "Генерировать"
		private void hTreeGenerateEx(object sender, ExecutedRoutedEventArgs e)
		{
			GetDataFromForm();

			STexture.Settings.Root.Add(new XElement("Генератор",
				new XAttribute("Название", "FractalTree"),
				new XElement("Параметры",
					new XElement("Ветвления",
						new XAttribute("Точка_ветвления", fractal.bp),
						new XAttribute("Угол_ветвления", fractal.ba),
						new XAttribute("Длина_ветвей", fractal.bl),
						new XAttribute("Глубина", fractal.depth)),
					new XElement("Отклонения",
						new XAttribute("Точка_ветвления", fractal.bpDev),
						new XAttribute("Угол_ветвления", fractal.baDev),
						new XAttribute("Длина_ветвей", fractal.blDev)),
					new XElement("Цвет",
						new XAttribute("Стволов", fractal.palette[0]),
						new XAttribute("Ветвей", fractal.palette[1]),
						new XAttribute("Листьев", fractal.palette[2])))));

			// Диалог успешен
			DialogResult = true;
		}
	}
}
